/*
1. 获取用户的收获地址
  1.1 绑定点击事件
  1.2 调用小程序内置 api 获取用户的收获地址 wx.chooseAddress

2. 获取用户对当前小程序 所授予的获取地址状态  scope
      2.1  假设 用户 点击收获地址的提示框 确定
      scop 值 为true 直接调用获取收获地址
      2.2  假设 用户 从来没有调用过 收获地址的 API
 k     scop 值 为 undefined   直接调用获取收获地址
      2.3  假设 用户 点击收获地址的提示框 取消
      scop 值 为 false
        2.3.1 诱导用户自己打开 权限设置页面 当用户重新给与 获取地址权限的时候
        2.3.2 获取收获地址
      2.4 将获取的地址存到本地存储中
3. 页面加载完毕
    3.0 onLoad  onShow
    3.1 获取本地存储中的地址数据
    3.2 将数据 设置给data 中的一个变量

4. onShow 
    4.0 回到商品详情页面 第一次添加商品的时候 手动添加了属性
        num = 1;
        checked = true
    4.1 获取缓存中的购物车数组
    4.2 把购物车数据 填充到datak中

5. 全选实现 数据的展示
  5.1 onShow 获取缓存中的购物车数组
  5.2 根据购物车中的商品数据 所有的商品都被选中 checked=true

6. 总价格和总数量
  6.1 都需要商品被选中才进行计算
  6.2获取购物车的数组
  6.3遍历
  6.4判断商品是否被选中
  6.5 总价格 += 商品的单价 * 商品的数量
  6.6 总数量 += 商品的数量
  6.7 把计算后的价格和数量 设置回data 中即可

7. 商品的选中
  7. 绑定change 事件
  7.2 获取到被修改的商品对象
  7.3 商品对象的选中状态 相反
  7.4 重新填充回 data 中 和缓存中
  .5 重新计算全选。 总价格。。总数量

8.全选和反选
  8.1 全选复选框绑定事件 chenge
  8.2 获取 data 中的全选变量 allChecked
  8.3 直接取反 allChecked = !allChecked
  8.4 遍历购物车数组 让里面 商品选中的状态 跟随 allChecked 改变而改变
  8.5 把购物车数组 和 allChecked 重新设置回 data 及将购物车数据重新设置到缓存

9. 商品数量的编辑
  9.1 给 + - 按钮绑定同一个点击事件 区分的关键 在于自定义属性的区别
  9.2 "+" "+1"
  9.3 "-" "-1"
  9.4 传递被点击的商品id goods_id
  9.5 获取data中的购物车数组 来获取需要被修改的商品对象
    9.5.1 当购物车的数量为 1 时，用户再次点击时，会给出弹框提示
    9.5.2 并询问是否删除
  9.6 直接修改商品对象的数量 num
  9.7 把cart 数组 重新设置回 缓存 和data中   this.catCart

10. 点击结算
  10.1 判断有没有收获地址信息
  10.2 判断用户有没有选购商品
  10.3 经过以上的验证 跳转到支付页面
*/


// 导入封装好的异步收获地址方法
import {
  getSetting,
  chooseAddress,
  openSetting,
  showModal,
  showToast
} from "../../utils/asyncWx.js"
import regeneratorRuntime from '../../lib/runtime/runtime';


Page({
  data: {
    address: {}, //获取商品在缓存中的信息
    cart: [], //商品存在购物车中的数据
    allChecked: false, //商品的选中状态
    totalPrice: 0, //购物车总价格
    totalNum: 0 //购物车中添加的数量

  },
  onShow() {
    // 1. 获取缓存中收获地址信息
    const address = wx.getStorageSync('address');
    // 4.1 获取缓存中的购物车数据
    const cart = wx.getStorageSync('cart') || [];
    // // 5.1 计算全选
    // // every 数组方法 会遍历 会接收一个回调函数 那么 每一个回调函数都返回true 那么every的返回值就是true
    // // 只要有一个返回false 那么就不再执行，直接返回false
    // // 空数组调用every 返回值就是true
    // // 设置全选按钮的选中状态，利用cart的数组长度进行验证 
    // // const allChecked = cart.length?cart.every(v => v.checked):false;
    // let allChecked = true;
    // // 6. 总价格 总数量
    // let totalPrice = 0;
    // let totalNum = 0;

    // cart.forEach(v => {
    //   if (v.checked) {
    //     totalPrice += v.num * v.goods_price;
    //     totalNum += v.num;
    //   } else {
    //     allChecked = false
    //   }
    // })
    // // 6.1 判断数组是否为空
    // allChecked = cart.length != 0 ? allChecked : false;
    // // 2.给 data 赋值
    // this.setData({
    //   address,
    //   cart,
    //   allChecked,
    //   totalPrice,
    //   totalNum
    // })

    this.setData({
      address
    });
    this.setCart(cart);
  },
  //点击 收获地址 
  async handleChooseAddress() {
    try {
      // 1. 获取权限状态 
      const res1 = await getSetting();
      const scopeAddress = res1.authSetting["scope.address"];
      // 2. 判断权限状态
      if (scopeAddress === false) {
        await openSetting();
      }
      // 3. 调用获取收获地址的 api
      let address = await chooseAddress();
      // 3.1 将地址拼接保存到缓存中去
      address.all = address.provinceName + address.cityName + address.countyName + address.detailInfo;
      // console.log(res2);
      // 4.最终将地址存入缓存中
      wx.setStorageSync('address', address)
    } catch (error) {
      console.log(error);

    }
  },

  // 商品的选中
  handeItemChange(e) {
    //1. 获取被修改的商品id
    const goods_id = e.currentTarget.dataset.id;
    // console.log(goods_id);
    // console.log(e);
    // 2. 获取购物车数组
    let {
      cart
    } = this.data;
    // 3.找到被修改的商品对象
    let index = cart.findIndex(v => v.goods_id === goods_id);
    // 4.选中状态取反
    cart[index].checked = !cart[index].checked

    this.setCart(cart);

  },

  // 设置购物车状态同时 重新计算 底部工具栏的数据 全选 总价格 购买的数量
  setCart(cart) {
    let allChecked = true;
    // 6. 总价格 总数量
    let totalPrice = 0;
    let totalNum = 0;

    cart.forEach(v => {
      if (v.checked) {
        totalPrice += v.num * v.goods_price;
        totalNum += v.num;
      } else {
        allChecked = false
      }
    })
    // 6.1 判断数组是否为空
    allChecked = cart.length != 0 ? allChecked : false;

    this.setData({
      cart,
      totalPrice,
      totalNum,
      allChecked
    });
    wx.setStorageSync("cart", cart);
  },

  // 商品的全选功能
  handleItemAllCheck() {
    // 1. 获取data 中的数据
    let {
      cart,
      allChecked
    } = this.data;
    // 2. 修改值
    allChecked = !allChecked;
    // 3. 循环修改 cart 数组 中的商品选中状态
    cart.forEach(v => v.checked = allChecked);
    // 4. 修改后的值填充会data中，或缓存中
    // 利用封装好的 setCart 方法进行实现
    this.setCart(cart);
  },

  // 商品数量的编辑功能
  async handleItemNumEdit(e) {
    // wx.showModal({
    //   title: '提示',
    //   content: '这是一个模态弹窗',
    //   success (res) {
    //     if (res.confirm) {
    //       console.log('用户点击确定')
    //     } else if (res.cancel) {
    //       console.log('用户点击取消')
    //     }
    //   }
    // })
    // return;



    // 1 获取传递过来的参数
    const {
      operation,
      id
    } = e.currentTarget.dataset;
    // console.log(operation, id );
    // 2. 获取购物车数组
    let {
      cart
    } = this.data;
    // 3. 找到需要修改的商品索引
    const index = cart.findIndex(v => v.goods_id === id);
    // 4.判断是否要执行删除
    if (cart[index].num === 1 && operation === -1) {
      // 给出弹框提示
      // wx.showModal({
      //   title: '提示',
      //   content: '这是一个模态弹窗',
      //   success: (res) => {S
      //     if (res.confirm) {
      //       cart.splice(index, 1);
      //       this.setCart(cart);
      //     } else if (res.cancel) {
      //       console.log('用户点击取消')
      //     }
      //   }
      // })
      const res = await showModal({
        content: "您是否要删除？"
      });
      if (res.confirm) {
        cart.splice(index, 1);
        this.setCart(cart);
      }
    } else {
      // 4. 进行修改数量
      // 可以看作为 num += 1  或 num += -1
      cart[index].num += operation;
      // 5。设置回缓存和data中
      this.setCart(cart);
    }

  },

  // 点击结算
 async handlePay() {
    // 1.判断收获地址
    const {address,totalNum} = this.data;
    if ( !address.userName ) {
     await showToast({title:"您还没有选择收获地址"});
     return;
    }
    // 判断有没有选中商品
    if(totalNum === 0){
    await showToast({title:"您还没有选购商品"});
     return;
    }
    // 跳转到支付页面
    wx.navigateTo({
      url:'/pages/pay/pay'
    });
  }
})